#include <string.h>
#include <cmath>   
#include <iostream>  //预处理器指令 a PREPROCESSOR directive
using namespace std; //使定义可见   make definitions visible

/*
  C++ Primer 4.9 类型组合
  指针,数组,结构的组合使用

*/


struct antarctica_years_end
{  
  int year;
  //some really interesting data,etc.*
  //一些非常有趣的数据,等*
};

int main(){

  //创建antarctica_years_end类型的变量：
  antarctica_years_end s01,s02,s03;//s01,s02,s03 are structures

  //然后使用成员运算符访问其成员
  s01.year= 1998;
  cout << "001 通过 . 修改后 s1: " << s01.year << endl;

  //可创建指向这种结构的指针：
  antarctica_years_end *pa = &s01;

  //将该指针设置为有效地址后，就可使用间接成员运算符来访问成员：
  pa->year=1999;

  cout << "002 通过 -> 修改后 s1: " << s01.year << endl;

  //可创建结构数组：
  antarctica_years_end trio[3] = {s01,s02,s03}; //array of 3 structures

  //使用成员运算符访问元素的成员
  trio[0].year = 2003; //trio[0] is a structure


  cout << "003 通过通过数组修改后 s1: " << s01.year << endl;
  cout << "004 通过数组修改后 数组[0]: " << trio[0].year << endl;


  //由于数组名是一个指针，因此也可使用间接成员运算符：
  (trio+1)->year=2004;//same as trio[1].year=2004;
  cout << "005 通过数组 -> 修改后 数组[1]: " << (trio+1)->year << endl;


  //可创建指针数组：
  antarctica_years_end * arp[3]={&s01,&s02,&s03};
  arp[0]->year = 2000;
  cout << "006 通过指针数组修改后 s1: " << arp[0]->year << endl;
  
  //可创建指向上述数组的指针：
  antarctica_years_end **ppa = arp; //其中arp是一个数组的名称，因此它是第一个元素的地址。但其第一个元素为指针，因此ppa是一个指针，指向一个指向antarctica_years_end的指针。

  //自动类型推断
  auto ppd = arp;
  
  cout << "007 通过数组指针 查看 s1: " << (*ppa)[0].year << endl;
  cout << "008 通过数组指针 查看 s1: " << (*ppa)->year << endl;
  cout << "009 通过类型推断 查看 s1: " << (*ppd)->year << endl;


}


